#pragma once

#include "log.hpp"
#include "Sock.hpp"
#include <iostream>
#include <vector>
#include <cerrno>
#include <cstring>
#include <unistd.h>
#include <sys/select.h>

static const int g_num = (sizeof(fd_set) * 8);    // 可容纳的最大文件描述符数量
static const int g_none_fd = -1;                  // fd_array中不关注的文件描述符暂时设置为-1

#define SIZE 1024

class SelectServer
{
public:
    SelectServer(uint16_t port, const std::string& ip = "");
    void init();     // 初始化函数
    void start();    // Select服务器开始运行函数
    ~SelectServer(); // 析构函数

private:
    void CheckFdArray();              // 关注文件描述符队列检查打印函数
    void SelectHandler(fd_set rfd);   // 就虚拟文件描述符处理函数
    void Accepter();                  // 从网络中获取tcp链接函数
    void Reciver(int read_fd);        // 数据读取函数

    int _listenfd;     // 用于listen的文件描述符
    uint16_t _port;    // 端口号
    std::string _ip;   // 可接收链接的ip地址
    std::vector<int> _fd_array;  // 文件描述符序列
};